<?php
/**
 * ベースURL シングルトン
 *
 * @author tanaka
 * @package View_Helper
 * @subpackage BaseUrl
 */
class View_Helper_Url_Base extends View_Helper_UrlAbstract
{
	/**
	 * インスタンス
	 *
	 * @var View_Helper_BaseUrl
	 */
	protected static $_instance;

	/**
	 * インスタンスの取得
	 *
	 * @return View_Helper_Url_Base
	 */
	public static function getInstance()
	{
		if (is_null(self::$_instance)) {
			self::$_instance = new self();
		}

		return self::$_instance;
	}

	/**
	 * ベースURL
	 *
	 * @var string
	 */
	protected $_baseUrl = '';

	/**
	 * ベースURLのセット
	 * @param $baseUrl
	 * @return View_Helper_Url_Base
	 */
	public function setBaseUrl($baseUrl)
	{
		$this->_baseUrl = $baseUrl;
		return $this;
	}

	/**
	 * ベースURLの取得
	 * @return string
	 */
	public function getBaseUrl()
	{
		return $this->_baseUrl;
	}

	/**
	 * パラメータ
	 * @var string
	 */
	protected $_params = array();

	/**
	 * クエリストリングを作成します。
	 *
	 * @param array $param
	 * @return string
	 */
	protected function _createQueryString(array $params)
	{
		$result = '';

		$isFirst = true;

		foreach ($params as $key => $value) {
			if (strlen($value) == 0) continue;

			if ($isFirst) {
				$result .= $this->_paramStartString;
				$isFirst = false;
			}
			else {
				$result .= $this->_paramNextString;
			}
			$result .= $key . $this->_paramValueString . urlencode($value);
		}

		return $result;
	}
	
	/**
	* プラグインをセットします。
	*
	* @param View_Helper_Url_PluginAbstract $plugin
	* @return View_Helper_Url_Base
	*/
	public function setPlugin(View_Helper_Url_PluginAbstract $plugin)
	{
		$this->_paramNextString = $plugin->getNextString();
		$this->_paramStartString = $plugin->getStartString();
		$this->_paramValueString = $plugin->getValueString();
		return $this;
	}

	/**
	 * 現在のパラメータを取得
	 *
	 * @param string $key
	 * @return mixed
	 */
	public function getParam($key)
	{
		return isset($this->_params[$key]) ? $this->_params[$key] : null;
	}
	
	/**
	 * パラメータのセット
	 * @param array $params
	 * @return View_Helper_Url_Base
	 */
	public function setAllParams(array $params)
	{
		foreach($params as $key => $value){
			$this->setParam($key, $value);
		}
		
		return $this;
	}

	/**
	 * パラメータのセット
	 * @param string $key
	 * @param mixed $value
	 * @return View_Helper_Url_Base
	 */
	public function setParam($key, $value = null)
	{
		if (is_null($value) && isset($this->_params[$key])) {
			unset($this->_params[$key]);
		}
		elseif (!is_null($value)) {
			$this->_params[$key] = $value;
		}

		return $this;
	}
	
	/**
	 * 現在設定されているクエリストリングを取得します。
	 * 
	 * @return
	 */
	public function getQuery($key = null, $value = null)
	{
		$params = $this->_params;
		
		if (!is_null($key) && !is_null($value)) {
			$params[$key] = $value;
		}
		
		return $this->_createQueryString($params);
	}

	/**
	 * URLの取得
	 *
	 * @param string optional $key
	 * @param string optional $value
	 * @return string
	 */
	public function getUrl($key = null, $value = null)
	{
		return $this->getBaseUrl() . $this->getQuery($key, $value);
	}

	/**
	 * URL文字列に変換
	 *
	 * @return string
	 */
	public function __toString()
	{
		return $this->getUrl();
	}

}
